{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 随机森林和Extra-Trees"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import datasets\n",
    "\n",
    "X, y = datasets.make_moons(noise=0.3, n_samples=500, random_state=666)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x108ff5630>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[y==0,0], X[y==0,1])\n",
    "plt.scatter(X[y==1,0], X[y==1,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 随机森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n            max_depth=None, max_features='auto', max_leaf_nodes=None,\n            min_impurity_decrease=0.0, min_impurity_split=None,\n            min_samples_leaf=1, min_samples_split=2,\n            min_weight_fraction_leaf=0.0, n_estimators=500, n_jobs=-1,\n            oob_score=True, random_state=666, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble.forest import RandomForestClassifier\n",
    "\n",
    "# 随机森林会使用bagging的方式取样\n",
    "rf_clf = RandomForestClassifier(n_estimators=500,   # 有多少颗决策树\n",
    "                                random_state=666,\n",
    "                                oob_score=True,     # oob作为测试集\n",
    "                                n_jobs=-1)\n",
    "rf_clf.fit(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.89200000000000002"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rf_clf.oob_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n            max_depth=None, max_features='auto', max_leaf_nodes=16,\n            min_impurity_decrease=0.0, min_impurity_split=None,\n            min_samples_leaf=1, min_samples_split=2,\n            min_weight_fraction_leaf=0.0, n_estimators=500, n_jobs=-1,\n            oob_score=True, random_state=666, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rf_clf2 = RandomForestClassifier(n_estimators=500,   # 有多少颗决策树\n",
    "                                 max_leaf_nodes=16,  # 每个决策树最多有多少个叶子节点\n",
    "                                random_state=666,\n",
    "                                oob_score=True,     # oob作为测试集\n",
    "                                n_jobs=-1)\n",
    "rf_clf2.fit(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.90600000000000003"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rf_clf2.oob_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用Extra-Trees"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ExtraTreesClassifier(bootstrap=True, class_weight=None, criterion='gini',\n           max_depth=None, max_features='auto', max_leaf_nodes=None,\n           min_impurity_decrease=0.0, min_impurity_split=None,\n           min_samples_leaf=1, min_samples_split=2,\n           min_weight_fraction_leaf=0.0, n_estimators=500, n_jobs=1,\n           oob_score=True, random_state=666, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble.forest import ExtraTreesClassifier\n",
    "\n",
    "et_clf = ExtraTreesClassifier(n_estimators=500, bootstrap=True, oob_score=True,\n",
    "                              random_state=666)\n",
    "\n",
    "et_clf.fit(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.89200000000000002"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "et_clf.oob_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 集成学习解决回归问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble.bagging import BaggingRegressor\n",
    "from sklearn.ensemble.forest import RandomForestRegressor, ExtraTreesRegressor"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 具体如何做？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
